/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package suministros.ejb30.DAO;

import java.util.List;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.PersistenceUnit;
import javax.persistence.Query;
import javax.sql.DataSource;
import suministros.ejb30.TO.AlertaTO;
import suministros.ejb30.TO.EmpresaTO;
import suministros.ejb30.TO.SistemaTO;
import suministros.ejb30.TO.ZonaTO;
import suministros.ejb30.entity.Alertas;
import suministros.ejb30.helper.Utiles_Convertir;

/**
 *
 * @author Luis_Angel
 */
@Stateless
public class SumiGestionAlertasDAO implements SumiGestionAlertasDAOLocal {

     @PersistenceUnit(unitName="suministros-pu")
      EntityManagerFactory emf;
      EntityManager em;

     @Resource(name="jdbc/Administracion")
      DataSource dsAdministracion;

     @PostConstruct
      public void inicializaBean()
      {
        this.em = this.emf.createEntityManager();
      }

    @PreDestroy
      public void finalizaBean() {
        this.em.close();
      }

    public boolean insertarAlertas(List<Alertas> alertas) throws Exception {
         boolean retorno = false;
         EntityTransaction tx = this.em.getTransaction();
          tx.begin();
           try {

                for(Alertas al : alertas){
                    al.setId_sistema(3);  
                    this.em.persist(al);
                    this.em.flush();
                }
                tx.commit();
              retorno = true;
            } catch (Exception e) {
                 tx.rollback();
              throw e;
            }
           return retorno;
    }
    public List<AlertaTO> obtenerAlertas(List<EmpresaTO> empresas, List<ZonaTO> zonas, List<SistemaTO> sistemas) throws Exception{

        List<AlertaTO> alertaretornar1= new ArrayList<AlertaTO>();
        List<AlertaTO> alertaretornar2= new ArrayList<AlertaTO>();
        List<AlertaTO> alertaretornar3= new ArrayList<AlertaTO>();
        if(empresas.isEmpty()){

        }
        else{
        Query consulta= this.em.createNativeQuery("select t.descripcion_valor, a.desc_adicional, convert(char(10), a.fecha,103)," +
               " a.id_empresa, id_zona, id_sistema from alertas a inner join tipo t on  a.id_tabla_tipo=t.id_tabla_tipo");
        List<AlertaTO> lista2= Utiles_Convertir.convertirTODetalleIngreso_AlertasTO(consulta.getResultList());
        for(AlertaTO alerta: lista2){
            for(int i=0; i<sistemas.size(); i++){
                if(alerta.getSistema().compareTo(sistemas.get(i).getCodigo()+"")==0){
                    alerta.setNomsistema(sistemas.get(i).getDescripcion());
                    alertaretornar1.add(alerta);
                }
            }
        }
        for(AlertaTO alerta: alertaretornar1){
            for(int i=0; i<empresas.size(); i++){
                if(alerta.getEmpresa().compareTo(empresas.get(i).getCodigo())==0){
                    alerta.setNomempresa(empresas.get(i).getRazon());
                    alertaretornar2.add(alerta);
                }
            }
        }
        for(AlertaTO alerta: alertaretornar2){
            for(int i=0; i<zonas.size(); i++){
                if(alerta.getZona().compareTo(zonas.get(i).getId_zona())==0){
                    alerta.setNomzona(zonas.get(i).getNom_zona());
                    alertaretornar3.add(alerta);
                }
            }
        }
        }
        return alertaretornar3;
    }
 public int obtenerAlertasTamaño(List<EmpresaTO> empresas, List<ZonaTO> zonas, List<SistemaTO> sistemas) throws Exception{
        int tamaño= 0;
        List<AlertaTO> alertaretornar1= new ArrayList<AlertaTO>();
        List<AlertaTO> alertaretornar2= new ArrayList<AlertaTO>();
        List<AlertaTO> alertaretornar3= new ArrayList<AlertaTO>();
        if(empresas.isEmpty()){

        }
        else{
        Query consulta= this.em.createNativeQuery("select t.descripcion_valor, a.desc_adicional, convert(char(10), a.fecha,103)," +
               " a.id_empresa, id_zona, id_sistema from alertas a inner join tipo t on  a.id_tabla_tipo=t.id_tabla_tipo");
        List<AlertaTO> lista2= Utiles_Convertir.convertirTODetalleIngreso_AlertasTO(consulta.getResultList());
        for(AlertaTO alerta: lista2){
            for(int i=0; i<sistemas.size(); i++){
                if(alerta.getSistema().compareTo(sistemas.get(i).getCodigo()+"")==0){
                    alerta.setNomsistema(sistemas.get(i).getDescripcion());
                    alertaretornar1.add(alerta);
                }
            }
        }
        for(AlertaTO alerta: alertaretornar1){
            for(int i=0; i<empresas.size(); i++){
                if(alerta.getEmpresa().compareTo(empresas.get(i).getCodigo())==0){
                    alerta.setNomempresa(empresas.get(i).getRazon());
                    alertaretornar2.add(alerta);
                }
            }
        }
        for(AlertaTO alerta: alertaretornar2){
            for(int i=0; i<zonas.size(); i++){
                if(alerta.getZona().compareTo(zonas.get(i).getId_zona())==0){
                    alerta.setNomzona(zonas.get(i).getNom_zona());
                    alertaretornar3.add(alerta);
                    tamaño=tamaño+1;
                }
            }
        }
        }
        
        return tamaño;
    }

 public void generarAlertas() throws Exception
  {
    Connection cnx = null;
    try {

      cnx = this.dsAdministracion.getConnection();
      CallableStatement csLlamada = cnx.prepareCall("{ call [dbo].[f_sumi_actualizarAlerta]()}");
      csLlamada.execute();
    }
    catch (SQLException ex) {
      System.out.print(ex.getMessage());
    } finally {
      try {
        cnx.close();
      } catch (Exception ex) {
        Logger.getLogger(SumiGestionAlertasDAO.class.getName()).log(Level.SEVERE, null, ex);
      }
    }
  }

    // Add business logic below. (Right-click in editor and choose
    // "Insert Code > Add Business Method")
 
}
